# Sequence.java

    package org.codefilarete.stalactite.sql.ddl.structure;

    import javax.annotation.Nullable;

    import java.util.Collections;
    import java.util.Map;
    import java.util.Set;

    import org.codefilarete.stalactite.query.model.Fromable;
    import org.codefilarete.stalactite.query.model.Selectable;
    import org.codefilarete.stalactite.sql.ddl.structure.Database.Schema;

    import static org.codefilarete.tool.Nullable.nullable;

    /**
     * Representation of a database sequence.
     *
     * @author Guillaume Mary
     */
    public class Sequence implements Fromable {

    	@Nullable
    	private final Schema schema;

    	private final String name;

    	private final String absoluteName;

    	@Nullable
    	private Integer initialValue;

    	@Nullable
    	private Integer batchSize;

    	public Sequence(String name) {
    		this(null, name);
    	}

    	public Sequence(@Nullable Schema schema, String name) {
    		this.schema = schema;
    		if (this.schema != null) {
    			this.schema.addSequence(this);
    		}
    		this.name = name;
    		this.absoluteName = nullable(schema).map(Schema::getName).map(s -> s + "." + name).getOr(name);
    	}

    	@Nullable
    	public Schema getSchema() {
    		return schema;
    	}

    	@Override
    	public String getName() {
    		return name;
    	}

    	@Override
    	public String getAbsoluteName() {
    		return absoluteName;
    	}

    	/**
    	 * Returns an empty {@link Set} because sequences are quite erratic across database vendors and some have columns, others have some functions.
    	 * @return an empty {@link Set}
    	 */
    	@Override
    	public Set<? extends Selectable<?>> getColumns() {
    		return Collections.emptySet();
    	}

    	/**
    	 * @return an empty {@link Map}
    	 */
    	@Override
    	public Map<Selectable<?>, String> getAliases() {
    		return Collections.emptyMap();
    	}

    	@Nullable
    	public Integer getInitialValue() {
    		return initialValue;
    	}

    	public void setInitialValue(@Nullable Integer initialValue) {
    		this.initialValue = initialValue;
    	}

    	public Sequence withInitialValue(@Nullable Integer initialValue) {
    		this.initialValue = initialValue;
    		return this;
    	}

    	@Nullable
    	public Integer getBatchSize() {
    		return batchSize;
    	}

    	public void setBatchSize(@Nullable Integer batchSize) {
    		this.batchSize = batchSize;
    	}

    	public Sequence withBatchSize(@Nullable Integer batchSize) {
    		this.batchSize = batchSize;
    		return this;
    	}
    }